package com.mgkj.controller.WMS;


import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.mgkj.annotation.Log;
import com.mgkj.common.result.Result;
import com.mgkj.common.utils.MapUtils;
import com.mgkj.dto.CustomInfoDto;
import com.mgkj.dto.yf.CoptnoDto;
import com.mgkj.dto.yf.CustomOrderDto;
import com.mgkj.dto.yf.InitSalesSlipBodyDto;
import com.mgkj.dto.yf.InitSalesSlipDto;
import com.mgkj.entity.Copma;
import com.mgkj.entity.WmsInvml;
import com.mgkj.mapper.DeliveryNoticeMapper;
import com.mgkj.mapper.InvBarcodeOperationMapper;
import com.mgkj.service.BmBarcodeDetailService;
import com.mgkj.service.InvBarcodeOperationService;
import com.mgkj.service.InvBarcodeTransactionService;
import com.mgkj.service.SaleService;
import com.mgkj.vo.CmsmqVo;
import com.mgkj.vo.yf.itemVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@RestController
@Api(tags = "销货出库相关接口")
@RequestMapping("api/DeliveryNotice")
public class DeliveryNoticeController {

    @Autowired
    private DeliveryNoticeMapper deliveryNoticeMapper;

    @Autowired
    private SaleService saleService;

    @Autowired
    private InvBarcodeOperationService invBarcodeOperationService;

    @Autowired
    private InvBarcodeOperationMapper invBarcodeOperationMapper;

    @Autowired
    private BmBarcodeDetailService bmBarcodeDetailService;

    @Autowired
    private InvBarcodeTransactionService invBarcodeTransactionService;


//    private final ConcurrentHashMap<String, Object> lockMap = new ConcurrentHashMap<>();


    @ApiOperation("获取客户订单")
    @PostMapping("/getCustomOrder")
    public Result getCoptn(CustomOrderDto dto) {
        PageHelper.startPage(dto.getPage(), dto.getPageSize());
        Page<Map<String, Object>> page1 = PageHelper.startPage(dto.getPage(), dto.getPageSize(), "TC002 DESC");
        List<Map<String, Object>> list = saleService.getCustomOrder(dto.getStartTime(),dto.getEndTime(), dto.getCompany());
        Map<String, Object> map = MapUtils.getMap(page1, list);
        return Result.ok(map);
    }

    @ApiOperation("获取客户信息")
    @PostMapping("/getCustomInfo")
    public Result getCustomInfo(@RequestBody CustomInfoDto dto) {
        List<Copma> list = deliveryNoticeMapper.getCustomInfo(dto);
        return Result.ok(list);
    }

    @ApiOperation("获取出货通知单")
    @Log("获取出货通知单")
    @PostMapping("/getCoptno")
    public Result getCoptno(@RequestBody CoptnoDto dto) {

        PageHelper.startPage(dto.getPage(), dto.getPageSize());
        Page<Map<String, Object>> page1 = PageHelper.startPage(dto.getPage(), dto.getPageSize(), "TN002 DESC");
        List<Map<String, Object>> list = saleService.getCoptno(dto);
        Map<String, Object> map = MapUtils.getMap(page1, list);
        if (list.isEmpty()) {
            return Result.fail("该范围没有出货通知单数据").message("该范围没有出货通知单数据");
        }
        return Result.ok(map);
    }

    @ApiOperation("查看销货单单据性质")
    @GetMapping("/lldList")
    public Result lldList(){
        List<CmsmqVo> list = deliveryNoticeMapper.selectXhVo();
        return  Result.ok(list);
    }

    @ApiOperation("查看品号/批号/库存")
    @GetMapping("/itemList/{itemCode}/{warehouseCode}")
    public Result itemList(@PathVariable String itemCode, @PathVariable String warehouseCode) {
        // 使用获取到的路径参数查询数据
        List<itemVo> list = deliveryNoticeMapper.selectItemVo(itemCode, warehouseCode);
        if (list.isEmpty()) {
            return Result.fail().message("该范围没有品号批号库存数据");
        }
        return Result.ok(list);
    }

    @ApiOperation("查看该品在wms中的库位做指引展示")
    @GetMapping("/wmsInvmlList/{itemCode}/{warehouseCode}")
    public Result wmsInvmlList(@PathVariable String itemCode, @PathVariable String warehouseCode) {
        // 使用获取到的路径参数查询数据
        List<WmsInvml> list = deliveryNoticeMapper.selectWmsInvmlList(itemCode, warehouseCode);
        if (list.isEmpty()) {
            return Result.fail().message("仓库没有库位信息！");
        }
        return Result.ok(list);
    }


    @ApiOperation("录入销货单")
    @Log("录入销货单")
    @PostMapping("/insertSalesSlip")
    public Result insertSalesSlip(@RequestBody InitSalesSlipDto initSalesSlipDto) throws IOException {
        // qihu - 对散户进行特判：属于3051的，同一出货通知单生成同一销货单
        if ("3051".equals(initSalesSlipDto.getTG004().trim())) {
//        if ("1001".equals(initSalesSlipDto.getTG004().trim())) {

            if (initSalesSlipDto.getInitSalesSlipBodyDtos() == null || initSalesSlipDto.getInitSalesSlipBodyDtos().isEmpty()) {
                return Result.fail("销货单明细不能为空").message("销货单明细不能为空");
            }

            // 按出货通知单(TH045+TH046)分组
            Map<String, List<InitSalesSlipBodyDto>> groupedBodies = initSalesSlipDto.getInitSalesSlipBodyDtos()
                    .stream()
                    .collect(Collectors.groupingBy(body -> body.getTH045() + "_" + body.getTH046()));

            // 存储所有生成的出货单
            List<String> slipNumbers = new ArrayList<>();

            for (Map.Entry<String, List<InitSalesSlipBodyDto>> entry : groupedBodies.entrySet()) {
                InitSalesSlipDto groupDto = new InitSalesSlipDto();

                groupDto.setCreateBy(initSalesSlipDto.getCreateBy());
                groupDto.setCreator(initSalesSlipDto.getCreator());
                groupDto.setUserGroup(initSalesSlipDto.getUserGroup());
                groupDto.setCreateDate(initSalesSlipDto.getCreateDate());
                groupDto.setFlag(initSalesSlipDto.getFlag());
                groupDto.setTG001(initSalesSlipDto.getTG001());
                groupDto.setTG002(initSalesSlipDto.getTG002());
                groupDto.setTG003(initSalesSlipDto.getTG003());
                groupDto.setTG004(initSalesSlipDto.getTG004());
                groupDto.setTG005(initSalesSlipDto.getTG005());
                groupDto.setTG006(initSalesSlipDto.getTG006());
                groupDto.setTG009(initSalesSlipDto.getTG009());
                groupDto.setTG010(initSalesSlipDto.getTG010());
                groupDto.setTG023(initSalesSlipDto.getTG023());
                groupDto.setCompany(initSalesSlipDto.getCompany());
                groupDto.setTG017(initSalesSlipDto.getTG017());
                groupDto.setTG011(initSalesSlipDto.getTG011());
                groupDto.setTG012(initSalesSlipDto.getTG012());
                groupDto.setTG044(initSalesSlipDto.getTG044());

                // 设置当前分组的明细
                groupDto.setInitSalesSlipBodyDtos(entry.getValue());


                // 调用服务生成销货单
                Result slipResult = saleService.salesSlipByOrder(groupDto);
                if (slipResult.getCode() != 200) {
                    System.out.println(slipResult.getData());
                    return Result.fail((String) slipResult.getData()).message((String) slipResult.getData());
                }

                // 收集生成的单据编号
                slipNumbers.add(slipResult.getData().toString());
            }

            return Result.ok(slipNumbers).message("录入成功，共生成" + slipNumbers.size() + "张销货单");
        }

        Result slips = saleService.salesSlipByOrder(initSalesSlipDto);
        if (slips.getCode() != 200) {
            System.out.println(slips.getMessage());
            return Result.fail((String) slips.getData()).message((String) slips.getData());
        }
        return Result.ok("单据生成成功:" + initSalesSlipDto.getTG001() + '_' + initSalesSlipDto.getTG002()).message("录入成功");
    }




































//    @PostMapping("/getDeliveryNotice")
//    @ApiOperation(value = "获取全部发货通知单")
//    public Result<PageInfo<DeliveryNotice>> getDeliveryNotice(@RequestBody PageDTO pageDTO){
//        PageHelper.startPage(pageDTO.getPageNum(), pageDTO.getPageSize());
//        List<DeliveryNotice> deliveryNoticeList = deliveryNoticeMapper.getDeliveryNoticeList();
//        PageInfo<DeliveryNotice> pageInfo = PageInfo.of(deliveryNoticeList);
//        return Result.ok(pageInfo);
//    }
//
//    @PostMapping("/getDeliveryWarehouse")
//    @ApiOperation(value = "获取发货仓库信息")
//    public Result<List<DeliveryWarehouse>> getDeliveryWarehouse(@RequestBody List<String> docNoList) {
//        List<DeliveryWarehouse> deliveryWarehouseList = deliveryNoticeMapper.getDeliveryWarehouseList(docNoList);
//        return Result.ok(deliveryWarehouseList);
//    }
//
//    @PostMapping("/getDeliveryDetail")
//    @ApiOperation(value = "获取发货明细-最新数据")
//    @Transactional
//    public Result<List<DeliveryDetail>> getDeliveryDetail(@RequestBody DeliveryDetailDTO detailDTO) {
//        // 清除对应的发货明细
//        deliveryNoticeMapper.deleteDeliveryDetailSummaryByCreateBy(detailDTO.getCreateBy());
//        // 查询最新数据
//        List<DeliveryDetail> detailList = deliveryNoticeMapper.getDeliveryDetail(detailDTO);
//        for (DeliveryDetail detail : detailList) {
//            // 保存到发货明细汇总表 sales_summary
//            deliveryNoticeMapper.saveSalesSummary(detail, detailDTO.getCreateBy());
//        }
//        return Result.ok(detailList);
//    }
//
//    @PostMapping("/getDeliveryDetailMid")
//    @ApiOperation(value = "获取发货明细-中间表数据")
//    public Result<List<DeliveryDetail>> getDeliveryDetailMid(@RequestBody DeliveryDetailDTO detailDTO) {
//        // 查询发货明细表 sales_summary
//        List<DeliveryDetail> detailList = deliveryNoticeMapper.getDeliveryDetailSummaryByCreateBy(detailDTO.getCreateBy());
//        return Result.ok(detailList);
//    }
//
//    @PostMapping("/isScanningCodeRecord")
//    @ApiOperation(value = "判断是否有扫码记录")
//    public Result isScanningCodeRecord(@RequestBody String createBy) {
//        Integer count = deliveryNoticeMapper.isScanningCodeRecord(createBy);
//        return Result.ok(count > 0);
//    }
//
//    @PostMapping("/BarCodeDetail")
//    @ApiOperation(value = "查询条码信息")
//    public Result<BarCodeDetailVo> BarCodeDetail(String barCode) {
//        BarCodeDetailVo barCodeDetail = deliveryNoticeMapper.getBarCodeDetailByBarCode(barCode);
//        return Result.ok(barCodeDetail);
//    }
//
//    @PostMapping("/getBarCodeDetail")
//    @ApiOperation(value = "扫码接口")
//    @Transactional
//    public Result getBarCodeDetail(@RequestBody getBarCodeDTO barCode) {
//        // 1.查询条码详情
//        BarCodeDetailVo barCodeDetail = deliveryNoticeMapper.getBarCodeDetailByBarCode(barCode.getBarCode());
//        if (barCodeDetail == null) {
//            return Result.fail().message("条码不存在");
//        }
//
//        // 2.查询销售汇总
//        List<SalesSummary> salesSummary = deliveryNoticeMapper.getSalesSummaryByItemCode(barCodeDetail.getItemCode(), barCode.getCreateBy());
//        if (salesSummary == null || salesSummary.isEmpty()) {
//            return Result.fail().message("品号不符合");
//        }
//
//        // 3.查询该条码操作档 汇总数量
//        Double qtySum = deliveryNoticeMapper.getQtySum(barCode.getBarCode());
//        if (qtySum == null) {
//            qtySum = 0.0;
//        }
//
//        // 4.计算剩余可分配数量
//        double remainingQty = barCodeDetail.getQty() - qtySum;
//        if (remainingQty <= 0) {
//            return Result.fail().message("条码剩余数量不足");
//        }
//
//
//        // 5.查询是否有未匹配完的记录
//        Integer count = deliveryNoticeMapper.getUnMatchQtyList(barCode.getCreateBy());
//        if (count == null || count == 0) {
//            return Result.fail().message("所有记录已匹配完成，请提交");
//        }
//
//        // 返回的标签列表
//        List<BmBarcodeDetail> barCodeDetailList = new ArrayList<>();
//        // 6.分配数量
//        for (SalesSummary s : salesSummary) {
//            if (s.getItemCode().equals(barCodeDetail.getItemCode()) && remainingQty > 0 && s.getMatchQty() < s.getBusinessQty()) {
//                double neededQty = s.getBusinessQty() - s.getMatchQty(); // 需要分配的数量
//                double allocateQty = Math.min(neededQty, remainingQty); // 本次分配的数量
//                // 更新中间表匹配量
//                deliveryNoticeMapper.updateSalesSummaryOfMatchQty(s.getId(), allocateQty, s.getCreateBy(), barCode.getBarCode());
//                // 8.生成新条码 bm_barcode_detail
//                BmBarcodeDetail newBarcodeDetail = new BmBarcodeDetail();
//                newBarcodeDetail.setId(UUID.randomUUID().toString());
//                // 获取当前时间
//                Date currentDate = new Date();
//                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//                String formattedDate = sdf.format(currentDate);
//                // 新条码规则 原条码日期替换为当前日期+序号
//                String[] parts = barCodeDetail.getBarcode().split("#");
//                String queryBarCode = parts[0] + "#" + formattedDate + "#"; // 拼接品号+当前日期 查询(最大流水号+1)的值
//                String maxNumber = deliveryNoticeMapper.getMaxBarCodeDetail(queryBarCode);
//                // 新条码barcode
//                String newBarCode = barCodeDetail.getBarcode().split("#")[0] + "#" + formattedDate + "#" + maxNumber;
//                newBarcodeDetail.setBarcode(newBarCode); // 标签号
//                newBarcodeDetail.setId(UUID.randomUUID().toString()); // id
//                newBarcodeDetail.setCustomerNo(s.getCustomerNo()); // 客户单号
//                newBarcodeDetail.setCombinationLotNo(barCodeDetail.getLotCode()); // 批号
//                newBarcodeDetail.setItemNo(barCodeDetail.getItemCode()); // 品号
//                newBarcodeDetail.setItemName(barCodeDetail.getItemName()); // 品名
//                newBarcodeDetail.setItemSpec(barCodeDetail.getItemSpec()); // 规格
//                newBarcodeDetail.setQty(BigDecimal.valueOf(allocateQty)); // 取出的数量
//                newBarcodeDetail.setSnWarehouseNo(barCodeDetail.getWarehouseCode()); // 仓库编号
//                newBarcodeDetail.setSnCellNo(barCodeDetail.getBinCode()); // 库位编号
//                newBarcodeDetail.setUnitNo(barCodeDetail.getUnitNo()); // 单位编号
//                newBarcodeDetail.setUnitName(barCodeDetail.getUnitName()); // 单位编号
//                newBarcodeDetail.setStandardCol02("2"); // 1:领料出库,2:销货出库
//                newBarcodeDetail.setRemark(barCodeDetail.getRemark()); // 备注
//                newBarcodeDetail.setCreateDate(DateTime.now()); // 创建时间
//                newBarcodeDetail.setCreateBy(barCode.getCreateBy()); // 创建人
//                boolean save = bmBarcodeDetailService.save(newBarcodeDetail); // 插入标签表
//                if (!save) {
//                    return Result.fail().message("新条码保存失败");
//                }
//                barCodeDetailList.add(newBarcodeDetail); // 插入标签列表
//                remainingQty -= allocateQty;
//            }
//        }
//
//        // 7.记录条码操作记录 变化数量
//        InvBarcodeOperation invBarcodeOperation = new InvBarcodeOperation();
//        invBarcodeOperation.setId(UUID.randomUUID().toString()); // UUID
//        invBarcodeOperation.setBarcode(barCodeDetail.getBarcode()); // 条码编号
//        invBarcodeOperation.setQty(BigDecimal.valueOf(barCodeDetail.getQty() - remainingQty)); // 变化数量
//        invBarcodeOperation.setWarehouseNo(barCodeDetail.getWarehouseCode()); // 仓库编号
//        invBarcodeOperation.setCellNo(barCodeDetail.getBinCode()); // 库位编号
//        invBarcodeOperation.setItemNo(barCodeDetail.getItemCode()); // 品号
//        invBarcodeOperation.setItemName(barCodeDetail.getItemName()); // 品名
//        invBarcodeOperation.setItemSpec(barCodeDetail.getItemSpec()); // 规格
//        invBarcodeOperation.setUnitNo(barCodeDetail.getUnitNo()); // 单位编号
//        invBarcodeOperation.setChagType(3); // 3:销货出库
//        invBarcodeOperation.setStatusCode(0); // 0:未提交 1:已提交
//        invBarcodeOperation.setCreateDate(DateTime.now().toString()); // 创建时间
//        invBarcodeOperation.setCreateBy(barCode.getCreateBy()); // 操作人
//        invBarcodeOperation.setRemark(barCodeDetail.getRemark()); // 备注
//        boolean b = invBarcodeOperationService.save(invBarcodeOperation);
//        if (!b) {
//            return Result.fail().message("操作记录保存失败");
//        }
//        // 返回需要蓝牙打印的条码数据
//        if (barCodeDetailList.isEmpty()) {
//            return Result.fail().message("暂无数据");
//        }
//        return Result.ok(barCodeDetailList);
//    }
//
//    @PostMapping("/getBarCodeOperation")
//    @ApiOperation(value = "获取已扫描中间表数据")
//    public Result<List<SalesSummary>> getBarCodeOperation(@RequestBody String createBy) {
//        List<SalesSummary> salesSummaryList = deliveryNoticeMapper.getSalesSummaryByCreateBy(createBy);
//        return Result.ok(salesSummaryList);
//    }
//
//    @PostMapping("/getInvBarcodeOperation")
//    @ApiOperation(value = "获取已扫描条码操作档记录")
//    public Result<List<InvBarcodeOperationVo>> getInvBarcodeOperation(@RequestBody String createBy) {
//         List<InvBarcodeOperationVo> InvBarcodeOperationList = deliveryNoticeMapper.getInvBarcodeOperationVo(createBy);
//        return Result.ok(InvBarcodeOperationList);
//    }
//
//    @PostMapping("/resetData")
//    @ApiOperation(value = "重置数据")
//    @Transactional
//    public Result resetData(@RequestBody String createBy) {
//        try {
//            // 1.删除中间表
//            deliveryNoticeMapper.deleteDeliveryDetailSummaryByCreateBy(createBy);
//            // 2.删除条码操作档 -> 条码状态：未提交 & 条码类型：销货出库
//            deliveryNoticeMapper.deleteInvBarcodeOperationByCreateBy(createBy);
//        } catch (Exception e) {
//            return Result.fail().message("重置失败");
//        }
//        return Result.ok();
//    }
//
//    @PostMapping("/delBarCodeOperation")
//    @ApiOperation(value = "删除单个已扫码数据")
//    @Transactional
//    public Result<Object> delBarCodeOperation(@RequestBody String id) {
//        InvBarcodeOperation invBarcodeOperation = deliveryNoticeMapper.getInvBarcodeOperationById(id); // 获取条码操作记录
//        double qty = invBarcodeOperation.getQty().doubleValue(); // 条码变化量
//        // 回滚中间表的匹配量
//        List<SalesSummary> salesSummary = deliveryNoticeMapper.getSalesSummaryByItemCode(invBarcodeOperation.getItemNo(), invBarcodeOperation.getCreateBy());
//        for (SalesSummary s : salesSummary) {
//            if (invBarcodeOperation.getItemNo().equals(s.getItemCode()) && qty > 0) {
//                if (s.getCurrentNum() > qty) {
//                    // 匹配量 > 条码变化量: -> 匹配量 = 匹配量 - 条码变化量
//                    int i = deliveryNoticeMapper.updateQtySubtraction(s.getId(), qty, invBarcodeOperation.getCreateBy());
//                    if (i <= 0) {
//                        return Result.fail().message("中间表匹配量回滚失败");
//                    }
//                    qty = 0;
//                } else {
//                    // 匹配量 < 条码变化量 -> 匹配量 = 0
//                    int i = deliveryNoticeMapper.updateQtyZero(s.getId(), qty, invBarcodeOperation.getCreateBy());
//                    if (i <= 0) {
//                        return Result.fail().message("中间表匹配量回滚失败");
//                    }
//                    qty -= s.getCurrentNum();
//                }
//            } else {
//                break;
//            }
//        }
//        boolean b = deliveryNoticeMapper.deleteInvBarcodeOperationById(id);
//        if (!b) {
//            return Result.fail().message("条码操作档删除失败");
//        }
//        return Result.ok().message("删除成功");
//    }
//
//    @ApiOperation("提交-销售订单(已审核)->销货单(已审核)->生成销货出库单(已审核)")
//    @Log("提交-销售订单(已审核)->销货单(已审核)->生成销货出库单(已审核)")
//    @PostMapping("/SaleOutSubmit")
//    public synchronized Result SaleOutSubmit(@RequestBody SaleOutSubmitDTO submitDTO) {
//
//            System.out.println("submitDTO：" + submitDTO);
////        return Result.ok(submitDTO);
//            //同步中间表
//            JSONObject jsonObject;
//
//            MiddleReturnDto middleReturnDto = saleService.SaleOutStockInsertMiddleTable(submitDTO.getList());
//            jsonObject = saleService.SaleOutStockSubmit(middleReturnDto);
//
//            //提交
//            System.out.println(jsonObject);
//            // 获取执行结果的 code
//            String executionCode = jsonObject
//                    .getJSONObject("payload")
//                    .getJSONObject("std_data")
//                    .getJSONObject("execution")
//                    .getString("code");
//            // E10接口提交成功
//            if ("0".equals(executionCode)) {
//                for (String id : submitDTO.getInvBarcodeOperationIdList()) {
//                    // 1.修改操作档状态为已提交
//                    InvBarcodeOperation invBarcodeOperation = invBarcodeOperationMapper.selectByid(id);
//                    boolean b = invBarcodeOperationMapper.updateByid(invBarcodeOperation.getId());
//                    if (!b) {
//                        return Result.fail().message("修改操作档状态为已提交失败");
//                    }
//                    // 2.扣减条码的剩余数量
//                    int i = deliveryNoticeMapper.updateBmBarcodeDetailOfQty(invBarcodeOperation.getBarcode(), invBarcodeOperation.getQty().doubleValue());
//                    if (i <= 0) {
//                        return Result.fail().message("扣减条码的剩余数量失败");
//                    }
//                    // 4.保存条码结果档
//                    InvBarcodeTransaction invBarcodeTransaction = new InvBarcodeTransaction();
//                    BeanUtil.copyProperties(invBarcodeOperation, invBarcodeTransaction);
//                    boolean save = invBarcodeTransactionService.save(invBarcodeTransaction);
//                    if (!save) {
//                        return Result.fail().message("保存条码结果档失败");
//                    }
//                }
//                // 5.删除中间表
//                int i = deliveryNoticeMapper.deleteDeliveryDetailSummaryByCreateBy(submitDTO.getCreateBy());
//                if (i <= 0) {
//                    return Result.fail().message("删除中间表失败");
//                }
//            }
//            return Result.ok(jsonObject);
//        }




}
